<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>class类</title>
</head>
<body>
  <script>
    /* 
    // 手机
    function Phone(brand, price) {
      this.brand = brand;
      this.price = price;
    }

    // 添加方法
    Phone.prototype.call = function() {
      console.log("我可以打电话")
    }

    // 实例化对象
    let huawei = new Phone("华为", 5999);

    huawei.call();
    console.log(huawei); 
    */


    /* 
      ES6中类的特性
      1.类声明和类表达式都不会被提升
      2.类中的代码在执行时，会强制开启严格模式
      3.类的所有方法都不可枚举，并且不能与new组合使用
    */

    // 类声明 方式
    // class
    class Phone {
      // 构造方法  名字不能修改
      constructor(brand, price) {
        this.brand = brand
        this.price = price
      }

      // 方法必须使用该语法，不能使用 ES5 的对象完整形式
      call() {
        console.log(this.brand, this.price);
        console.log("我可以打电话");
      }
    }

    let onePlus = new Phone("onePlus", 5999);
    onePlus.call()

    // 类表达式
    // class关键字是必需的  名称是可选的
    var People = class {}         // 匿名表达式
    var People = class Man {}     // 命名表达式

    // 命名表达式中的名称只能在类的内部访问，如果在外部贸然使用，name就会抛出未定义的错误。
    var People = class Man {
      getSelf() {
        typeof Man;
        Man.name;
        new Man().getAge();
      }
      getAge() {
        return 28
      }
    }

    var people = new People();
    people.getSelf()            // 28
    console.log(People.name)    // "Man"
    // console.log(Man.name)    // 报错

    // 函数表达式类似，类表达式也能立即执行
    var people = new class {
      constructor(name) {
        this.name = name
      }
      getName() {
        return this.name
      }
    }("strick")

    people.getName()
  </script>
</body>
</html>